package gui.edit_objects;

import gui.list_objects.result_recherche_departement_model;
import gui.list_objects.result_recherche_pays_model;
import gui.list_objects.result_recherche_quartier_model;
import gui.list_objects.result_recherche_region_model;
import gui.list_objects.result_recherche_ville_model;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import objects.Adresse;
import objects.Departement;
import objects.Pays;
import objects.Quartier;
import objects.Region;
import objects.Ville;

import bdd_handler.AdresseDAO;
import bdd_handler.DepartementDAO;
import bdd_handler.PaysDAO;
import bdd_handler.QuartierDAO;
import bdd_handler.RegionDAO;
import bdd_handler.VilleDAO;
import bdd_handler.bdd;


public class Edit_Adresse extends JFrame implements ActionListener, ListSelectionListener{

	private static final long serialVersionUID = 1L;

	private JFrame parent;

	private PaysDAO pDAO;
	private RegionDAO rDAO;
	private DepartementDAO dDAO;
	private VilleDAO vDAO;
	private QuartierDAO qDAO;
	private AdresseDAO aDAO;
	private Adresse a;
	private JTextField type_adresse, n_rue, nom_rue;
	private boolean mknew;
	private JButton valider, annuler;

	private String[] list_type_rue;

	private JLabel lbl_ville;

	private Pays[] liste_pays;
	private Region[] liste_regions;
	private Departement[] liste_departements;
	private Ville[] liste_villes;
	private Quartier[] liste_quartiers;

	private result_recherche_pays_model pModel;

	private JTable jt_pays;

	private result_recherche_region_model rModel;

	private JTable jt_regions;

	private result_recherche_departement_model dModel;

	private JTable jt_departements;

	private result_recherche_ville_model vModel;

	private JTable jt_villes;

	private result_recherche_quartier_model qModel;

	private JTable jt_quartiers;

	private JComboBox<String> adresse_type_rue;

	public Edit_Adresse(JFrame parent, Adresse adresse){
		//recuperation de la fenetre parente
		this.parent=parent;
		this.parent.setVisible(false);

		//construction de la fenetre
		this.a=adresse;
		if(a.getId_adresse()==-1)
			mknew=true;
		else
			mknew=false;
		if(mknew)
			this.setTitle("Nouvelle Adresse");
		else
			this.setTitle("Editer Adresse");
		this.setSize(1000,400);
		this.setResizable(false);
		JPanel pan=new JPanel();
		pan.setLayout(null);
		this.setContentPane(pan);

		//creation des DAOs
		bdd db=new bdd();
		pDAO=new PaysDAO(db.getConnection());
		rDAO=new RegionDAO(db.getConnection());
		dDAO=new DepartementDAO(db.getConnection());
		vDAO=new VilleDAO(db.getConnection());
		qDAO=new QuartierDAO(db.getConnection());
		aDAO=new AdresseDAO(db.getConnection());

		//creation objets internes
		this.list_type_rue=new String[7];
		list_type_rue[0]="avenue";
		list_type_rue[1]="rue";
		list_type_rue[2]="place";
		list_type_rue[3]="boulevard";
		list_type_rue[4]="chemin";
		list_type_rue[5]="allée";
		list_type_rue[6]="impasse";

		liste_pays=pDAO.findAll();
		pModel=new result_recherche_pays_model(liste_pays);
		jt_pays=new JTable(pModel);
		jt_pays.getTableHeader().setReorderingAllowed(false);
		jt_pays.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_pays.getSelectionModel().addListSelectionListener(this);
		if(!mknew)
			jt_pays.getSelectionModel().setLeadSelectionIndex(pModel.getLineOfId(a.getVille().getDepartement().getRegion().getPays().getId_pays()));
		if(!mknew)
			liste_regions=rDAO.findByPays(a.getVille().getDepartement().getRegion().getPays().getId_pays());
		if(!mknew)
			rModel=new result_recherche_region_model(liste_regions);
		else
			rModel=new result_recherche_region_model();
		jt_regions=new JTable(rModel);
		jt_regions.getTableHeader().setReorderingAllowed(false);
		jt_regions.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_regions.getSelectionModel().addListSelectionListener(this);
		if(!mknew)
			jt_regions.getSelectionModel().setLeadSelectionIndex(rModel.getLineOfId(a.getVille().getDepartement().getRegion().getId_region()));
		if(!mknew)
			liste_departements=dDAO.findByRegion(a.getVille().getDepartement().getRegion().getId_region());
		if(!mknew)
			dModel=new result_recherche_departement_model(liste_departements);
		else
			dModel=new result_recherche_departement_model();	
		jt_departements=new JTable(dModel);
		jt_departements.getTableHeader().setReorderingAllowed(false);
		jt_departements.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_departements.getSelectionModel().addListSelectionListener(this);
		if(!mknew)
			jt_departements.getSelectionModel().setLeadSelectionIndex(dModel.getLineOfId(a.getVille().getDepartement().getId_departement()));
		if(!mknew)
			liste_villes=vDAO.findbyDepartement(a.getVille().getDepartement().getId_departement());
		if(!mknew)
			vModel=new result_recherche_ville_model(liste_villes);
		else
			vModel=new result_recherche_ville_model();
		jt_villes=new JTable(vModel);
		jt_villes.getTableHeader().setReorderingAllowed(false);
		jt_villes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_villes.getSelectionModel().addListSelectionListener(this);
		if(!mknew)
			jt_villes.getSelectionModel().setLeadSelectionIndex(vModel.getLineOfId(a.getVille().getId_ville()));
		if(!mknew)
			liste_quartiers=qDAO.findByVille(vModel.getLineOfId(a.getVille().getId_ville()));
		if(!mknew)
			qModel=new result_recherche_quartier_model(liste_quartiers);
		else
			qModel=new result_recherche_quartier_model();		
		jt_quartiers=new JTable(qModel);
		jt_quartiers.getTableHeader().setReorderingAllowed(false);
		jt_quartiers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_quartiers.getSelectionModel().addListSelectionListener(this);
		if(!mknew && a.getQuartier()!=null)
			jt_quartiers.getSelectionModel().setLeadSelectionIndex(vModel.getLineOfId(a.getQuartier().getId_quartier()));
		JScrollPane jsp_pays=new JScrollPane(jt_pays);
		JScrollPane jsp_regions=new JScrollPane(jt_regions);
		JScrollPane jsp_departements=new JScrollPane(jt_departements);
		JScrollPane jsp_villes=new JScrollPane(jt_villes);
		JScrollPane jsp_quartiers=new JScrollPane(jt_quartiers);

		JLabel lbl_type_adresse=new JLabel("intitulé de l'adresse:");
		type_adresse=new JTextField(a.getType_adresse());
		JLabel lbl_n_rue=new JLabel("n°");
		n_rue=new JTextField(a.getN_rue()+"");
		adresse_type_rue=new JComboBox<String>(list_type_rue);
		adresse_type_rue.setSelectedIndex(a.getType_rue());
		nom_rue=new JTextField(a.getNom_rue());
		if(!mknew)
			lbl_ville=new JLabel(a.getVille().getCp()+" "+a.getVille().getNom());
		else
			lbl_ville=new JLabel();
		JLabel lbl_quartier=new JLabel("Quartier(optionnel):");
		valider=new JButton("valider");
		valider.addActionListener(this);
		annuler=new JButton("annuler");
		annuler.addActionListener(this);

		//placer les objets
		pan.add(lbl_type_adresse);
		lbl_type_adresse.setBounds(10, 10, 200, 20);
		pan.add(type_adresse);
		type_adresse.setBounds(220, 10, 200, 20);
		pan.add(jsp_pays);
		jsp_pays.setBounds(10,40,150,90);
		pan.add(jsp_regions);
		jsp_regions.setBounds(170, 40, 150, 90);
		pan.add(jsp_departements);
		jsp_departements.setBounds(330, 40, 150, 90);
		pan.add(jsp_villes);
		jsp_villes.setBounds(490, 40, 150, 90);
		pan.add(lbl_n_rue);
		lbl_n_rue.setBounds(10, 140, 200, 20);
		pan.add(n_rue);
		n_rue.setBounds(220, 140, 200, 20);
		pan.add(adresse_type_rue);
		adresse_type_rue.setBounds(430, 140 ,200, 20);
		pan.add(nom_rue);
		nom_rue.setBounds(640, 140, 200, 20);
		pan.add(lbl_ville);
		lbl_ville.setBounds(850, 140, 200, 20);
		pan.add(lbl_quartier);
		lbl_quartier.setBounds(10, 170, 200, 20);
		pan.add(jsp_quartiers);
		jsp_quartiers.setBounds(220, 170, 150, 90);
		pan.add(annuler);
		annuler.setBounds(10, 270, 90, 20);
		pan.add(valider);
		valider.setBounds(110, 270, 90, 20);

		//action fermeture fenetre
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.addWindowListener(
				new WindowAdapter(){
					public void windowClosing(WindowEvent e){
						close();

					}
				}
				);
		//afficher la fenetre
		this.setVisible(true);
	}

	private void close(){
		this.parent.setVisible(true);
		this.dispose();
	}

	private void send()
	{
		a.setVille(vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1)));
		a.setType_adresse(type_adresse.getText());
		a.setN_rue(Integer.parseInt(n_rue.getText()));
		a.setType_rue(adresse_type_rue.getSelectedIndex());
		a.setNom_rue(nom_rue.getText());
		a.setQuartier(qDAO.find((int)qModel.getValueAt(jt_quartiers.getSelectedRow(), 1)));
		if(mknew)
			aDAO.create(a);
		else
			aDAO.update(a);
	}

	private boolean check()
	{
		if(type_adresse.getText().equals(""))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "l'intitulé de l'adresse n'a pas été renseigné", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		try{
			vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1));
		}
		catch(Exception e)
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "aucune ville n'a été choisie", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		try
		{
			Integer.parseInt(n_rue.getText());
		}
		catch(NumberFormatException e) {
			JOptionPane.showMessageDialog(this.getContentPane(), "le numéro n'est pas un entier", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if(nom_rue.getText().equals(""))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "le nom de la rue n'a pas été renseigné", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		Object source=e.getSource();

		if(source==annuler)
		{
			close();
		}
		if(source==valider)
		{
			if(check())
			{
				send();
				close();
			}
		}

	}

	@Override
	public void valueChanged( ListSelectionEvent e)
	{
		Object source = e.getSource();
		if(source == jt_pays.getSelectionModel()&& e.getFirstIndex() >= 0 )
		{
			update_tabs('p');
		}
		else if(source== jt_regions.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('r');
		}
		else if(source== jt_departements.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('d');
		}
		else if(source== jt_villes.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('v');
		}
		else if(source== jt_quartiers.getSelectionModel()&& e.getFirstIndex() >= 0)
		{

		}
	}

	private void update_tabs(char c){
		if(c=='a')
		{
			pModel.setNewData(pDAO.findAll());
			jt_pays.setModel(pModel);
			jt_pays.revalidate();
			jt_pays.repaint();
			rModel.reset();
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
			lbl_ville.setText("");
			lbl_ville.revalidate();
			lbl_ville.repaint();
		}		
		if(jt_pays.getSelectedRow()>=0 && c=='p')
		{
			liste_regions=rDAO.findByPays((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1));
			rModel.setNewData(liste_regions);
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
			lbl_ville.setText("");
			lbl_ville.revalidate();
			lbl_ville.repaint();
		}
		if(jt_regions.getSelectedRow()>=0 && c=='r')
		{
			liste_departements=dDAO.findByRegion((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1));
			dModel.setNewData(liste_departements);
			jt_departements.setModel(dModel);
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
			lbl_ville.setText("");
			lbl_ville.revalidate();
			lbl_ville.repaint();
		}
		if(jt_departements.getSelectedRow()>=0 && c=='d')
		{
			liste_villes=vDAO.findbyDepartement((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1));
			vModel.setNewData(liste_villes);
			jt_villes.setModel(vModel);
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
			lbl_ville.setText("");
			lbl_ville.revalidate();
			lbl_ville.repaint();
		}
		if(jt_villes.getSelectedRow()>=0 && c=='v')
		{
			Ville v=vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1));
			lbl_ville.setText(v.getCp()+" "+v.getNom());
			lbl_ville.revalidate();
			lbl_ville.repaint();
			liste_quartiers=qDAO.findByVille(v.getId_ville());
			qModel.setNewData(liste_quartiers);
			jt_quartiers.setModel(qModel);
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}



	}

}
